home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 2.iso
/
STUTTGART
/
LANG
/
C
/
LIB
/
DESK
/
CORE
/
Desk
/
h_doc
/
LinkList
< prev
next >
Wrap
Text File
|
1996-08-27
|
6KB
|
184 lines
/*
#### # # # #
# # # # # The FreeWare C library for
# # ## ### # # # # ### RISC OS machines
# # # # # # # # # # # ___________________________________
# # #### ### ## # # # #
# # # # # # # # # # Please refer to the accompanying
#### ### #### # # ##### # ### documentation for conditions of use
________________________________________________________________________
File: LinkList.h
Author: Copyright © 1992 John Winters
Version: 1.33 (30 May 1994)
Purpose: Linked list management routines
History:
27 Aug 1996 JS InsertBefore/After now work if pos is NULL.
*/
#ifndef __Desk_LinkList_h
#define __Desk_LinkList_h
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __Desk_Core_h
#include "Desk.Core.h"
#endif
/* Implementation notes
* ====================
* This module provides support for a linked list structure.
* YOU must supply an anchor for the list (a variable of type
* Desk_linklist_header). This is used to record pointers to the start and end
* of the list.
* The list itself is made up of your own structures, defined as follows:
* struct listelement
* {
* Desk_linklist_header header;
* ... Your own data here ...
* } listelement;
*
* a list-terminating pointer is represented as NULL
*
* The header's next field stores a pointer to the FIRST item
* its previous field stores a pointer to the LAST item
* (both these pointers will be nulls if the list is empty)
*
* To insert items into the list, you must malloc memory for one of your
* own listelement data structures, then call the appropriate function
* To delete an item from the list, call the unlink function, and then free
* all memory used by your structure.
*/
typedef struct Desk_linklist_header
{
struct Desk_linklist_header *next;
struct Desk_linklist_header *previous;
} Desk_linklist_header ;
extern void Desk_LinkList_AddToHead(Desk_linklist_header *anchor, Desk_linklist_header *item);
/*
inserts the given item at the head of the list
*/
extern void Desk_LinkList_AddToTail(Desk_linklist_header *anchor, Desk_linklist_header *item);
/*
inserts the given item at the end of the list
*/
extern void Desk_LinkList_InsertBefore(Desk_linklist_header *anchor,
Desk_linklist_header *pos,
Desk_linklist_header *item);
/*
inserts the given item BEFORE the item "pos"
If 'pos' is NULL, adds to head of list.
*/
extern void Desk_LinkList_InsertAfter(Desk_linklist_header *anchor,
Desk_linklist_header *pos,
Desk_linklist_header *item);
/*
inserts the given item AFTER the item "pos"
If 'pos' is NULL, adds to tail of list.
*/
extern Desk_bool Desk_LinkList_InList( const Desk_linklist_header *anchor, const Desk_linklist_header *item);
/*
* Returns Desk_bool_TRUE if the item is curently in the list. Note that this does
* NOT check item contents, merely compares item pointers.
* To check item contents, you must chain through the list yourself.
*/
extern int Desk_LinkList_ListLength( const Desk_linklist_header *anchor);
/*
* Returns the number of items in the list. It follows all the links
* and counts them... if you need this value a lot, I suggest you modify
* LinkList to keep a count in the anchor...
*/
extern void Desk_LinkList_Unlink(Desk_linklist_header *anchor, Desk_linklist_header *item);
/*
* Unlinks the item "item" from the given list.
* You must then free the memory used by it yourself.
*/
#define Desk_LinkList_FirstItem(x) ((void *)(x)->next)
/* Return pointer to the first item in the list
*/
#define Desk_LinkList_LastItem(x) ((void *)(x)->previous)
/* Return pointer to the last item in the list
*/
#define Desk_LinkList_Init(x) \
{ \
(x)->next = NULL; \
(x)->previous = NULL; \
}
/*
* Initialises a list anchor. Should be called before anchor used
* extern void Desk_LinkList_Init(Desk_linklist_header *item);
*/
#define Desk_LinkList_InitItem(x) \
{ \
(x)->next = NULL; \
(x)->previous = NULL; \
}
/*
* Initialises a list item. Should be called before item used,
* except when that item is immediately linked into a list
* extern void Desk_LinkList_InitItem(Desk_linklist_header *item);
*/
#define Desk_LinkList_NextItem(x) ((void *) ((Desk_linklist_header *)(x))->next)
/* Return the next item of a given one. If the current item is at
* the tail of the list, NULLPOINTER will be returned.
* extern void *Desk_LinkList_NextItem(Desk_linklist_header *item);
*
* Old definition:
* #define Desk_LinkList_NextItem(x) ((void *)(x)->next)
*
* NEW definition:
* you can now use Desk_LinkList_NextItem(&item);
* instead of Desk_LinkList_NextItem(&item->header);
*/
#define Desk_LinkList_PreviousItem(x) ((void *) ((Desk_linklist_header *)(x))->previous)
/* Return the previous item of a given one. If the current item is at
* the head of the list, NULLPOINTER will be returned.
* extern void *Desk_LinkList_PreviousItem(Desk_linklist_header *item);
*
* Old definition:
* #define Desk_LinkList_PreviousItem(x) ((void *)(x)->previous)
*
* NEW definition:
* you can now use Desk_LinkList_PreviousItem(&item);
* instead of Desk_LinkList_PreviousItem(&item->header);
*/
#ifdef __cplusplus
}
#endif
#endif